﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimulacionAgrofoods
{
    public class HeuristicaNueva
    {
        List<Frio> frios;
        public int vencimiento = 1;

        public HeuristicaNueva(List<Frio> frios) 
        {
            this.frios = frios;
        }

        public Frio Escoger_Frio(List<Lote> lotes, int dia)
        {

            int envio = 0;
            //Diciembre
            if (dia < 13)
            {
                foreach (Lote l in lotes)
                {
                    envio += l.Cantidad;
                }
                if (frios[0].Capacidad_Sobrante() >= envio && frios[0].Capacidad_Enfriamiento >= frios[0].Llegada_Día)
                {
                    return frios[0];
                }
                else if (frios[5].Capacidad_Sobrante() >= envio && frios[5].Capacidad_Enfriamiento >= frios[5].Llegada_Día)
                {
                    return frios[5];
                }
                else if (frios[2].Capacidad_Sobrante() >= envio && frios[2].Capacidad_Enfriamiento >= frios[2].Llegada_Día)
                {
                    return frios[2];
                }
                else if (frios[4].Capacidad_Sobrante() >= envio && frios[4].Capacidad_Enfriamiento >= frios[4].Llegada_Día)
                {
                    return frios[4];
                }
                else
                {
                    return frios[5];

                }

            }
            //Enero
            else if (dia < 43)
            {
                foreach (Lote l in lotes)
                {
                    envio += l.Cantidad;
                }
                if (frios[0].Capacidad_Sobrante() >= envio && frios[0].Capacidad_Enfriamiento >= frios[0].Llegada_Día)
                {
                    return frios[0];
                }
                else if (frios[1].Capacidad_Sobrante() >= envio && frios[1].Capacidad_Enfriamiento >= frios[1].Llegada_Día)
                {
                    return frios[1];
                }
                else if (frios[3].Capacidad_Sobrante() >= envio && frios[3].Capacidad_Enfriamiento >= frios[3].Llegada_Día)
                {
                    return frios[3];
                }
                else if (frios[5].Capacidad_Sobrante() >= envio && frios[5].Capacidad_Enfriamiento >= frios[5].Llegada_Día)
                {
                    return frios[5];
                }
                else if (frios[2].Capacidad_Sobrante() >= envio && frios[2].Capacidad_Enfriamiento >= frios[2].Llegada_Día)
                {
                    return frios[2];
                }
                else if (frios[4].Capacidad_Sobrante() >= envio && frios[4].Capacidad_Enfriamiento >= frios[4].Llegada_Día)
                {
                    return frios[4];
                }
                else
                {
                    return frios[1];

                }
            }
            //Febrero
            else if (dia < 73)
            {
                foreach (Lote l in lotes)
                {
                    envio += l.Cantidad;
                }
                if (frios[0].Capacidad_Sobrante() >= envio && frios[0].Capacidad_Enfriamiento >= frios[0].Llegada_Día)
                {
                    return frios[0];
                }
                else if (frios[1].Capacidad_Sobrante() >= envio && frios[1].Capacidad_Enfriamiento >= frios[1].Llegada_Día)
                {
                    return frios[1];
                }
                else if (frios[3].Capacidad_Sobrante() >= envio && frios[3].Capacidad_Enfriamiento >= frios[3].Llegada_Día)
                {
                    return frios[3];
                }
                else if (frios[5].Capacidad_Sobrante() >= envio && frios[5].Capacidad_Enfriamiento >= frios[5].Llegada_Día)
                {
                    return frios[5];
                }
                else if (frios[2].Capacidad_Sobrante() >= envio && frios[2].Capacidad_Enfriamiento >= frios[2].Llegada_Día)
                {
                    return frios[2];
                }
                else if (frios[4].Capacidad_Sobrante() >= envio && frios[4].Capacidad_Enfriamiento >= frios[4].Llegada_Día)
                {
                    return frios[4];
                }
                else
                {
                    return frios[1];

                }
            }
            //Marzo
            else if (dia < 103)
            {
                foreach (Lote l in lotes)
                {
                    envio += l.Cantidad;
                }
                if (frios[0].Capacidad_Sobrante() >= envio && frios[0].Capacidad_Enfriamiento >= frios[0].Llegada_Día)
                {
                    return frios[0];
                }
                else if (frios[1].Capacidad_Sobrante() >= envio && frios[1].Capacidad_Enfriamiento >= frios[1].Llegada_Día)
                {
                    return frios[1];
                }
                else if (frios[5].Capacidad_Sobrante() >= envio && frios[5].Capacidad_Enfriamiento >= frios[5].Llegada_Día)
                {
                    return frios[5];
                }
                else if (frios[2].Capacidad_Sobrante() >= envio && frios[2].Capacidad_Enfriamiento >= frios[2].Llegada_Día)
                {
                    return frios[2];
                }
                else if (frios[4].Capacidad_Sobrante() >= envio && frios[4].Capacidad_Enfriamiento >= frios[4].Llegada_Día)
                {
                    return frios[4];
                }
                else
                {
                    return frios[1];

                }
            }
            //Abril
            else if (dia < 133)
            {
                foreach (Lote l in lotes)
                {
                    envio += l.Cantidad;
                }
                if (frios[0].Capacidad_Sobrante() >= envio && frios[0].Capacidad_Enfriamiento >= frios[0].Llegada_Día)
                {
                    return frios[0];
                }
                else if (frios[5].Capacidad_Sobrante() >= envio && frios[5].Capacidad_Enfriamiento >= frios[5].Llegada_Día)
                {
                    return frios[5];
                }
                else if (frios[2].Capacidad_Sobrante() >= envio && frios[2].Capacidad_Enfriamiento >= frios[2].Llegada_Día)
                {
                    return frios[2];
                }
                else if (frios[4].Capacidad_Sobrante() >= envio && frios[4].Capacidad_Enfriamiento >= frios[4].Llegada_Día)
                {
                    return frios[4];
                }
                else
                {
                    return frios[5];

                }
            }
            //ETC
            else
            {
                foreach (Lote l in lotes)
                {
                    envio += l.Cantidad;
                }
                if (frios[0].Capacidad_Sobrante() >= envio && frios[0].Capacidad_Enfriamiento >= frios[0].Llegada_Día && lotes[0].Vencimiento < 35)
                {
                    return frios[0];
                }
                else if (frios[1].Capacidad_Sobrante() >= envio && frios[1].Capacidad_Enfriamiento >= frios[1].Llegada_Día && lotes[0].Vencimiento < 35)
                {
                    return frios[1];
                }
                else if (frios[3].Capacidad_Sobrante() >= envio && frios[3].Capacidad_Enfriamiento >= frios[3].Llegada_Día && lotes[0].Vencimiento < 35)
                {
                    return frios[3];
                }
                else if (frios[5].Capacidad_Sobrante() >= envio && frios[5].Capacidad_Enfriamiento >= frios[5].Llegada_Día)
                {
                    return frios[5];
                }
                else if (frios[2].Capacidad_Sobrante() >= envio && frios[2].Capacidad_Enfriamiento >= frios[2].Llegada_Día)
                {
                    return frios[2];
                }
                else if (frios[4].Capacidad_Sobrante() >= envio && frios[4].Capacidad_Enfriamiento >= frios[4].Llegada_Día)
                {
                    return frios[4];
                }
                else
                {
                    return frios[5];

                }
            }


           
           
            

        }

        public Frio Envio_Frio() 
        {

            List<Frio> friosordenados = frios.OrderBy(x => x.Duracion_Lote_Minimo()).ToList();

            return friosordenados[0];
        }

        public List<List<Lote>> Seleccionar_Camiones(List<Lote> lotes) 
        {
            List<List<Lote>> lotes_agrupados = new List<List<Lote>>();
            List<Lote> lotes_aux = new List<Lote>();

            if (lotes.Count == 0)
            {
                return lotes_agrupados;
            }
            else
            {
                for (int i = 0; i < lotes.Count; i++)
                {
                    lotes_aux.Add(lotes[i]);
                    if (i != lotes.Count - 1)
                    {
                        if (lotes_aux.Sum(x => x.Cantidad) + lotes[i + 1].Cantidad > 78)
                        {
                            lotes_agrupados.Add(lotes_aux);
                            lotes_aux = new List<Lote>();
                        }
                    }
                }
                if (lotes_aux.Count > 0)
                {
                    lotes_agrupados.Add(lotes_aux);
                }
                return lotes_agrupados;
            }
        }

    }
}
